/*          用户登录与注册功能代码      */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

#include "login.h"

// 登录与注册程序
int login_function(int mode, char *account, char *password)
{
    // printf("%s %s\n", account, password);
    FILE *fp = fopen("./res/account.txt", "r+");
    if (fp == NULL)
    {
        perror("fopen error");
        return -1;
    }

    ElemNode *head = headNode(); // 初始化链表头节点

    list_date(head, fp); // 读取账号数据到链表
    
    switch (mode)
    {
    case 1:
        return register_user(head, fp, account, password); // 注册程序
        break;

    case 2:
        return login_user(head, account, password); // 登录程序
        break;

    default:
        printf("error\n");
        break;
    }
    
    // traverse(head);// 遍历链表(测试)

    // 释放内存空间
    destroy_allToList(head);

    fclose(fp);
    return 0;
}

// 获取登录文件内容写入链表
void list_date(ElemNode *head, FILE *fp)
{
    char montage[1024] = {0};

    // 按行读取文件数据,存放到montage,并尾插入链表
    while (fgets(montage, sizeof(montage), fp))
    {
        int size = strlen(montage); // 计算montage的长度

        // 检查并移除末尾的换行符'\n'（如果存在）
        if (size > 0 && montage[size - 1] == '\n')
        {
            montage[size - 1] = '\0';
        }

        // 检查并移除末尾的回车符'\r'（如果存在）
        if (size > 1 && montage[size - 2] == '\r')
        {
            montage[size - 2] = '\0';
        }

        // 插入链表之前，打印montage的长度和内容（用于调试）
        // printf("Size after removing newline: %zu\n", strlen(montage));
        // printf("Line: %s\n", montage);

        // 将清理后的数据插入链表
        insert_tail(head, montage);
    }
}

// 注册功能
int register_user(ElemNode *head, FILE *fp, char *account, char *password)
{

    // 检查账号是否已存在
    if (search_account(head, account))
    {
        printf("账号已存在。\n");
        return 3;
    }
    
    // 将账号密码字符串拼接(用#分隔)
    char *buf = NULL;
    char separate[] = "#";
    buf = (char *)malloc((strlen(account) + strlen(password) + 2) * sizeof(char));
    strcpy(buf, account);
    strcat(buf, separate);
    strcat(buf, password);

    printf("hello\n"); // bug：需要打印一个字符串，后面代码才能成功运行

    fseek(fp, 0, SEEK_END);

    // 将账号密码写入文件
    fprintf(fp, "\n%s", buf);
    fflush(fp);

    // 将账号密码添加到链表
    insert_tail(head, buf);

    printf("账号注册成功\n");

    free(buf);

    return 2;
}

// 登录功能
int login_user(ElemNode *head, char *account, char *password)
{
    // char account[100] = {0};  // 账号
    // char password[100] = {0}; // 密码

    // scanf("%s %s", account, password);

    // 将账号密码字符串拼接(用#分隔)
    char *str = NULL;
    char separate[] = "#";
    char zero[] = "\0";
    str = (char *)malloc((strlen(account) + strlen(password) + 2) * sizeof(char));
    strcpy(str, account);
    strcat(str, separate);
    strcat(str, password);
    strcat(str, zero);

    if (search_data(head, str))
    {
        printf("登录成功\n");
        // free(str);
        return 1;
    }
    free(str);
    return 0;
}
